package com.parsechina.hpush.broker.spi;

import com.parsechina.hpush.broker.parser.*;
import io.netty.channel.Channel;

import java.io.Serializable;

/**
 * 协议处理接口
 *
 * @author linfeng
 * @since 2016/11/23
 */
public interface ProtocolProcessor extends Serializable {

    /**
     * 建立连接请求处理
     *
     * @param channel netty socket通道
     * @param msg     传递消息
     */
    void processConnect(Channel channel, ConnectMessage msg);


    /**
     * 强制关闭连接处理
     *
     * @param msg        传递的消息
     */
    void forceCloseConnection(ConnectMessage msg);

    /**
     * 强制关闭连接处理
     *
     * @param oldChannel 以前的通道
     * @param newChannel 新的通道
     * @param msg        传递的消息
     */
    void forceCloseConnection(Channel oldChannel, Channel newChannel, ConnectMessage msg);

    /**
     * 关闭连接
     * @param oldChannel
     */
    void closeConnection(Channel oldChannel);

    /**
     * 连接完成处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void completeConnect(Channel channel, ConnectMessage msg);

    /**
     * 发布确认处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processPubAck(Channel channel, PubAckMessage msg);

    /**
     * 发布释放处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processPubRel(Channel channel, PubRelMessage msg);

    /**
     * 发布消息处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processPublish(Channel channel, PublishMessage msg);

    /**
     * 发布收到处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processPubRec(Channel channel, PubRecMessage msg);

    /**
     * 发布完成处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processPubComp(Channel channel, PubCompMessage msg);

    /**
     * 断开连接处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processDisconnect(Channel channel, DisconnectMessage msg);

    /**
     * 连接丢失处理方法
     *
     * @param channel       socket通道
     * @param clientId      客户端ID
     * @param sessionStolen 会话是否被盗
     */
    void processConnectionLost(Channel channel, String clientId, boolean sessionStolen);

    /**
     * 取消订阅处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processUnsubscribe(Channel channel, UnsubscribeMessage msg);

    /**
     * 消息订阅处理方法
     *
     * @param channel socket通道
     * @param msg     传递的消息
     */
    void processSubscribe(Channel channel, SubscribeMessage msg);

    /**
     * 内部发送消息
     *
     * @param msg 传递的消息
     */
    void internalPublish(PublishMessage msg);

    /**
     * 是否存在客户端在本服务器中
     * @param clientId 客户端ID
     * @return true is exist, false is not exist
     */
    boolean isExistClientOfServer(String clientId);

    /**
     * 通知socket通道是可以写
     *
     * @param channel socket通道
     */
    void notifyChannelWritable(Channel channel);
}
